home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #3
/
Amiga Plus CD - 1997 - No. 03.iso
/
pd
/
demo-versionen
/
maxoncpp4-demo
/
demo
/
supercode
/
score.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-12-31
|
7KB
|
367 lines
//-------------------------------------
//
// SuperCode (c) 1996 by T.Kühn
//
// Programmiersprache: ANSI-C
// Projektstart: 30.07.95
//
// Modul: Score
//
//-------------------------------------
#include <pragma/intuition_lib.h>
#include <pragma/graphics_lib.h>
#include <pragma/exec_lib.h>
#include <pragma/dos_lib.h>
#include <struct.h>
//-------------------------------------
struct tkList highscores;
UBYTE str_day[LEN_DATSTRING+2];
UBYTE str_date[LEN_DATSTRING+2];
UBYTE str_time[LEN_DATSTRING+2];
struct DateTime date;
UBYTE file_name[]="PROGDIR:SuperCode.score";
struct Window *window_score=0;
struct ScoreData
{
struct RastPort *rp;
ULONG x,y,w,y2;
ULONG count;
};
struct Score *score_last=0;
void score_windowopen();
//-------------------------------------
void score_savenode(struct Score *score_org,struct tkfile *file)
{
const ULONG l=sizeof(struct Score);
ULONG t;
BYTE score[l+2];
memcpy(score,score_org,l);
file_write(file,"NEXT",4);
for (t=0;t<l;t++)
{
score[t]^=t+0xEB;
}
file_write(file,score,l);
}
//-------------------------------------
void score_save()
{
struct tkfile *file;
file = file_open(file_name,MODE_NEWFILE,FALSE);
if (file)
{
List_DoAll(&highscores,(APTR)score_savenode,(APTR)file);
}
file_free(&file);
}
//-------------------------------------
void score_load()
{
struct tkfile *file;
file = file_open(file_name,MODE_OLDFILE,ASKFILE_CANTOPEN);
{
const ULONG l=sizeof(struct Score);
ULONG t;
BYTE dummy[6],*new;
while(file->ok)
{
dummy[0]=0;
file_read(file,dummy,4);
if (0!=strncmp(dummy,"NEXT",4)) break;
new=Memory_Alloc(l);
file_read(file,new,l);
for (t=0;t<l;t++)
{
new[t]^=t+0xEB;
}
List_AddTail(&highscores,(APTR)new);
}
}
file_free(&file);
}
//-------------------------------------
//-------------------------------------
long score_compare(struct Score *score1,struct Score *score2)
{
LONG back=0;
if (score1->score > score2->score) back=-1;
if (score1->score < score2->score) back= 1;
if (back==0)
{
if (score1->time < score2->time) back=-1;
if (score1->time > score2->time) back= 1;
}
return back;
}
//-------------------------------------
//-------------------------------------
void score_output(struct Score *score,struct ScoreData *data)
{
UBYTE text[200],*text_order;
ULONG c;
ULONG t=score->time;
ULONG h=(t/3600);
ULONG m=(t-h*3600)/60;
ULONG s=(t-m*60+h*3600);
if (data->y < data->y2)
{
if (score_last!=score)
{
c=Scrn.DrawInfo->dri_Pens[TEXTPEN];
}
else
{
c=Scrn.DrawInfo->dri_Pens[SHINEPEN];
}
switch (score->order)
{
case ORDER_POS: text_order=CatStr(TXT_PREFPOSITION);break;
case ORDER_DESC: text_order=CatStr(TXT_PREFDESC);break;
case ORDER_RANDOM: text_order=CatStr(TXT_PREFRANDOM);break;
}
memcpy(&date.dat_Stamp,&score->date,sizeof(struct DateStamp));
date.dat_Format=FORMAT_CDN;
date.dat_Flags=DTF_SUBST;
date.dat_StrDay = str_day;
date.dat_StrDate = str_date;
date.dat_StrTime = str_time;
DateToStr(&date);
sprintf(text,"%2.2d %-10.10s %9.9d %2.2d:%02.2d:%02.2d %8.8s %2.2d %2.2d %2.2d %2.2d %6.6s",data->count++,score->name,score->score,h,m,s,str_date,score->lines,score->colors,score->columns,score->equals,text_order);
Txt_PrintFit(data->rp,text,0,data->x,data->y,data->w,0,c,Scrn.DrawInfo->dri_Pens[BACKGROUNDPEN],BOX_LEFT);
data->y+=data->rp->TxHeight+2;
}
}
//-------------------------------------
//-------------------------------------
void score_display()
{
score_windowopen();
{
struct Window *win=window_score;
struct RastPort *rp=window_score->RPort;
ULONG x=win->BorderLeft+4;
ULONG y=win->BorderTop+4;
ULONG w=win->Width-win->BorderLeft-win->BorderRight-8;
ULONG y2=win->Height-win->BorderBottom-rp->TxHeight-8;
struct ScoreData data={rp,x,y,w,y2,1};
SetAPen(rp,Scrn.DrawInfo->dri_Pens[BACKGROUNDPEN]);
RectFill(rp,x,y,x+w,y2);
Txt_PrintFit(rp,CatStr(TXT_SCORETITLE),0,x,y,w,0,Scrn.DrawInfo->dri_Pens[HIGHLIGHTTEXTPEN],Scrn.DrawInfo->dri_Pens[BACKGROUNDPEN],BOX_CENTER);
data.y+=rp->TxHeight+4;
data.count=1;
List_DoAll(&highscores,(APTR)score_output,(APTR)&data);
}
}
//-------------------------------------
//-------------------------------------
void score_windowopen()
{
if (!window_score)
{
window_score=OpenWindowTags(0,
WA_Title,CatStr(TXT_SCOREWINTITLE),
WA_Left,prg_prefs->win.score.Xpos,
WA_Top,prg_prefs->win.score.Ypos,
WA_Width,prg_prefs->win.score.WinW,
WA_Height,prg_prefs->win.score.WinH,
(Scrn.Scrn && Scrn.FlgPublic==FALSE) ? WA_CustomScreen : WA_PubScreen,Scrn.Scrn,
WA_Flags,
WFLG_ACTIVATE|
WFLG_CLOSEGADGET|
WFLG_DRAGBAR|
WFLG_DEPTHGADGET|
WFLG_NEWLOOKMENUS|
WFLG_RMBTRAP|
// WFLG_SIZEBBOTTOM|
WFLG_SIZEBRIGHT|
WFLG_SIZEGADGET|
0,
WA_IDCMP,
IDCMP_GADGETUP|
IDCMP_CLOSEWINDOW|
IDCMP_NEWSIZE|
0,
// WA_Zoom,0,
WA_AutoAdjust,TRUE,
WA_MaxWidth,-1,
WA_MaxHeight,-1,
WA_MinWidth,50,
WA_MinHeight,50,
TAG_END);
}
}
//-------------------------------------
void score_windowclose()
{
if (window_score)
{
window_close(window_score,&prg_prefs->win.score);
window_score=0;
}
}
//-------------------------------------
//-------------------------------------
LONG score_getbit()
{
LONG bit=0;
if (window_score)
{
bit=1 << window_score->UserPort->mp_SigBit;
}
return bit;
}
//-------------------------------------
VOID score_domsg()
{
struct Window *win=window_score;
struct IntuiMessage *msg;
struct Gadget *gadg;
LONG clas;
LONG code;
LONG qual;
LONG posx,posy,seco,micr;
while (window_score && (msg=(struct IntuiMessage*)GetMsg(win->UserPort)))
{
gadg = (APTR)msg->IAddress;
clas = msg->Class;
code = msg->Code;
qual = msg->Qualifier;
posx = msg->MouseX;
posy = msg->MouseY;
seco = msg->Seconds;
micr = msg->Micros;
ReplyMsg((struct Message*)msg);
switch (clas)
{
case IDCMP_CHANGEWINDOW:
// Window_StoreSize(MsgBlk);
break;
case IDCMP_RAWKEY:
break;
case IDCMP_NEWSIZE:
score_display();
break;
case IDCMP_MENUPICK:
// Command_Menu(MsgBlk,GadMsg.Code);
break;
case IDCMP_CLOSEWINDOW:
score_windowclose();
break;
case IDCMP_GADGETUP:
// score_dogadget(gadg->GadgetID,qual);
break;
case IDCMP_INACTIVEWINDOW:
break;
}
}
}
//-------------------------------------
//-------------------------------------
void score_add(struct Field *player,UBYTE *name)
{
struct Score *score;
if (player->finish)
{
score=(struct Score*)Memory_Alloc(sizeof(struct Score));
score_last=score;
score->score=code_getpoints(player);
score->columns=player->columns;
score->colors=player->num_colors;
score->equals=player->max_equal;
score->lines=player->lines;
score->time=player->sec_finish - player->sec_start;
score->order=player->val_order;
strncpy(score->name,name,MAX_PLAYERNAME);
DateStamp(&score->date);
List_AddSort(&highscores,&score->node,(APTR)score_compare);
// List_AddTail(&highscores,&score->node);
// List_Sort(&highscores,(APTR)score_compare);
score_save();
score_display();
}
}
//-------------------------------------
//-------------------------------------
void score_init()
{
List_Init(&highscores,NT_SCORE,0);
score_load();
}
//-------------------------------------
void score_free()
{
score_windowclose();
List_Free(&highscores);
}
//-------------------------------------